Leta 1966 so pri ameriškem zveznem koordinatorju za meteorologijo ugotovili, da
meteorologi po državi v svojih poročilih ne zaokrožajo odčitanih temperatur na
cele stopinje vsi na enak način, zato so izdelali priporočilo, ki določa, kako
je treba odčitek (realno število) zaokrožiti na najbližje celo število.
Pri tem naj se vrednost, ki je točno na sredini med dvema celima številoma,
zaokroži vedno navzgor (t.j. proti višji temperaturi, to velja tudi za negativne
odčitke). Tako se npr. vrednost $1.5$ zaokroži na $2$, vrednost $-1.5$ pa na $-1$.
V deželah, kjer merimo temperaturo v stopinjah Celzija (kjer ničla ustreza
ledišču vode in so zato meritve blizu ničle pomembne), je v navadi še dodatno
pravilo, ki določa, da temperature med $-0.5$ (vključno) in $0$ (izključno)
stopinjami sicer zaokrožimo na $0$, a zapišemo kot '-0', torej z negativnim predznakom.
Naloga
Napisali smo funkcijo zaokrozi(x), ki sprejme realno število $x$, ga zaokroži na
celo število upoštevaje obe gornji pravili in ga vrne, vendar so se vrstice premešale,
zamiki vrstic pa pobrisali. Uredi vrstice tako, da bo funkcija zopet delovala.
def zaokrozi(x):
if temperatura >= -0.5 and temperatura < 0:
return str(desetkrat // 10)
else:
return "-0"
else:
temperatura = float(x)
desetkrat = int(temperatura * 10)
return str(desetkrat // 10 + 1)
if desetkrat % 10 >= 5:
Vhodni podatki
Število $x$, ki ga je treba zaokrožiti.
Omejitve vhodnih podatkov
$-100. \leq x \leq 100.$
Izhodni podatki
Niz z zaokroženim številom.
Uradna rešitev
def zaokrozi(x):
"""Sprejme število in vrne niz z zaokroženim številom. Vrednosti točno na sredini
med dvema celima številoma zaokroži navzgor. Če je x med -0.5 vrne '-0'."""
temperatura = float(x)
if temperatura >= -0.5 and temperatura < 0:
return "-0"
else:
desetkrat = int(temperatura * 10)
if desetkrat % 10 >= 5:
return str(desetkrat // 10 + 1)
else:
return str(desetkrat // 10)
2017.1.2
Najlepši esej
1. podnaloga
Ministrstvo za lepobesedje je razpisalo natečaj za najlepše eseje. Pri ocenjevanju
esejev je določilo naslednje pravilo: esej je lep, če so v njem vse besede dolge
od $3$ do $8$ znakov. Če ne bo nobenega eseja, ki bi zadoščal določenemu pogoju, bo
posebna komisija odločala med tistimi eseji, ki imajo najmanj besed krajših od
$3$ znakov in daljših od $8$ znakov.
Ministrstvo je najelo programerja, ki je napisal funkcijo oceni(esej),
ki prebere en esej in vrne informacijo, ali je esej lep (vse besede so znotraj
predpisane dolžine). Če esej ni lep, vrne niz z vsebino, koliko besed
ima krajših od $3$ znakov in koliko daljših od $8$ znakov, sicer vrne
niz z vsebino, da je esej lep.
Naloga
Vrstice so se premešale in zamaknile! Uredi funkcijo, da bo pravilno delovala.
def oceni(esej):
for beseda in re.findall("[A-Za-z]+", vrstica):
with open(esej, 'r', encoding='utf-8') as esej:
for vrstica in esej:
if len(beseda) < 3:
prekratke += 1
predolge += 1
elif len(beseda) > 8:
predolge = 0
if prekratke == 0 and predolge == 0:
"""Sprejme esej v obliki .txt, ga prebere in določi, če je esej lep."""
return "Esej ni lep: {0} prekratkih, {1} predolgih besed.".format(prekratke, predolge)
else:
return "Esej je lep."
prekratke = 0
Vhodni podatki
Datoteka (npr. esej.txt).
Izhodni podatki
Informacija ali je esej lep ali esej ni lep, tako kot v spodnjih primerih.
Če esej ni lep, vrnjen niz vsebuje tudi število prekratkih ter število
predolgih besed.
Primer za lep esej:
>>> oceni('esej.txt')
Esej je lep.
Primer za esej, ki ni lep in vsebuje $12$ prekratkih in $7$ predolgih besed:
>>> oceni('esej.txt')
Esej ni lep: 12 prekratkih, 7 predolgih besed.
Komentar
Beseda je sestavljena iz malih in velikih črk angleške abecede, to so znaki
od "a" do "z" in od "A" do "Z". Med besedami so presledki, vejice,
pike in drugi znaki, ki niso črke po angleški abecedi. Beseda je vedno v eni
vrstici (besede niso nikoli deljene).
Posamezne vrstice vhodnega besedila so dolge po največ $100$ znakov.
Uradna rešitev
def oceni(esej):
"""Sprejme esej v obliki .txt, ga prebere in določi, če je esej lep."""
prekratke = 0
predolge = 0
with open(esej, 'r', encoding='utf-8') as esej:
for vrstica in esej:
for beseda in re.findall("[A-Za-z]+", vrstica):
if len(beseda) < 3:
prekratke += 1
elif len(beseda) > 8:
predolge += 1
if prekratke == 0 and predolge == 0:
return "Esej je lep."
else:
return "Esej ni lep: {0} prekratkih, {1} predolgih besed.".format(prekratke, predolge)
2017.1.3
Pomanjkanje sendvičev
1. podnaloga
Vodvstvo Caféja Ma$\phi$ja se je odločilo, da lačnim študentom ponudi $6$ tipov
sendvičev na študentske bone. Napisan je program za robota, vendar so se
vrstice premešale.
Program naj na začetku prebere podatke o trenutni zalogi sendvičev.
Nato naj kupce sprašuje po želenih sendvičih in vsakemu sproti postreže, če je
sendvič še na zalogi, sicer pa naj izpiše, da ga ni. Program naj se konča, ko
kupec zahteva sendvič št. $0$.
Na koncu naj program izpiše še podatke o najpopularnejšem sendviču (tistem,
ki je bil največkrat zahtevan) in izpiše številke sendvičev, ki jih je bilo
premalo.
Predpostaviš lahko, da v vhodnih podatkih ni napak (npr. zahtevana številka
sendviča je vedno od $0$ do $6$).
Naloga
Uredi vrstice, da bo program deloval.
premalo = False
while True:
t = int(input("Pozdravljeni, kateri sendvic zelite? "))
N = 6
najvec = max(stZahtev)
if not 1 <= t <= N:
print("Sendvicev tipa %d nam je zal zmanjkalo. "
break
stZahtev[t-1] += 1
if stZahtev[t-1] > zaloga[t-1]:
"Vec srece prihodnjic!"%t)
" ".join(str(t+1) for t in range(N) if stZahtev[t] > zaloga[t]))
premalo = True
else:
print("Izvolite sendvic st. %d. Dober tek!"%t)
if premalo:
print("Premalo je bilo sendvicev tipa %s." %
zaloga = [int(input("Zaloga sendvicev st. %d: "%t)) for t in range(1, N+1)]
stZahtev = [0] * N
print("Najbolj popularni so sendvici st. %s." % " ".join(str(t+1) for t in range(N) if stZahtev[t] == najvec))
Vhodni podatki
Program prebere zalogo sendvičev. Nato uporabnik vneše število med $0$ in $6$.
Izhodni podatki
Program izpiše, če robot postreže sendvič, ki je na zalogi, sicer izpiše,
da sendviča ni na zalogi. Če kupec zahteva sendvič št. $0$, se program konča
in izpiše podatke o najpopularnejšem sendviču ter številke sendvičev, ki
jih je bilo premalo.
Primer
'Zaloga sendvicev st. 1:' 7
'Zaloga sendvicev st. 2:' 2
'Zaloga sendvicev st. 3:' 1
'Zaloga sendvicev st. 4:' 3
'Zaloga sendvicev st. 5:' 2
'Zaloga sendvicev st. 6:' 4
'Pozdravljeni, kateri sendvic zelite?' 1
'Izvolite sendvic st. 1. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 3
'Izvolite sendvic st. 3. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 5
'Izvolite sendvic st. 5. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 3
'Sendvicev tipa 3 nam je zal zmanjkalo. Vec srece prihodnjic!'
'Pozdravljeni, kateri sendvic zelite?' 6
'Izvolite sendvic st. 6. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 5
'Izvolite sendvic st. 5. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 5
'Sendvicev tipa 5 nam je zal zmanjkalo. Vec srece prihodnjic!'
'Pozdravljeni, kateri sendvic zelite?' 6
'Izvolite sendvic st. 6. Dober tek!'
'Pozdravljeni, kateri sendvic zelite?' 0
'Premalo je bilo sendvicev st. 3 5.'
'Najbolj popularni so sendvici st. 5.'
Uradna rešitev
N = 6
zaloga = [int(input("Zaloga sendvicev st. %d: "%t)) for t in range(1, N+1)]
stZahtev = [0] * N
premalo = False
while True:
t = int(input("Pozdravljeni, kateri sendvic zelite? "))
if not 1 <= t <= N:
break
stZahtev[t-1] += 1
if stZahtev[t-1] > zaloga[t-1]:
print("Sendvicev tipa %d nam je zal zmanjkalo. "
"Vec srece prihodnjic!"%t)
premalo = True
else:
print("Izvolite sendvic st. %d. Dober tek!"%t)
if premalo:
print("Premalo je bilo sendvicev tipa %s." %
" ".join(str(t+1) for t in range(N) if stZahtev[t] > zaloga[t]))
najvec = max(stZahtev)
print("Najbolj popularni so sendvici st. %s." % " ".join(str(t+1) for t in range(N) if stZahtev[t] == najvec))
2017.1.5
Pike za tisočice
1. podnaloga
Pri zapisovanju velikih števil pogosto zaradi preglednosti ločimo skupine
treh števk s piko.
Primer
$12345$ zapišemo kot "$12.345$",
$5379473457$ zapišemo kot "$5.379.473.457$",
$9876,01234$ pa zapišemo kot "$9.876,01234$".
Kot vidimo iz zadnjega primera, vrivamo pike le levo od decimalne vejice,
desno od nje pa ne.
Naloga
Napisana je funkcija izpis_stevila(s), ki kot parameter dobi niz s, ki predstavlja
neko število v desetiškem zapisu. V tem nizu nastopajo le znaki od 0 do 9
in mogoče še decimalna vejica.
Funkcija dobljeno število v nizu vrne s pikami kot je opisano zgoraj.
Vrstice funkcije so se premešale. Uredi jih, da bo funkcija zopet delovala.
def izpis_stevila(s):
n = s.find(',')
if n < 0:
if 0 < i < n and (n - i) % 3 == 0:
n = len(s)
izhodni_niz = ''
izhodni_niz += s[i]
izhodni_niz += '.'
return izhodni_niz
for i in range(len(s)):
Vhodni podatki
Niz, ki predstavlja neko število v desetiškem zapisu.
Izhodni podatki
Niz, ki predstavlja število v vhodnem nizu z dodanimi pikami.
def izpis_stevila(s):
"""Vrne niz, ki predstavlja število v vhodnem nizu z dodanimi pikami."""
n = s.find(',')
if n < 0:
n = len(s)
izhodni_niz = ''
for i in range(len(s)):
if 0 < i < n and (n - i) % 3 == 0:
izhodni_niz += '.'
izhodni_niz += s[i]
return izhodni_niz